"""
使用的技术
Echarts 是个由百度开源的数据可视化，凭借着良好的交互性，精巧的图表设计，得到了众多开发者的认可，而Python 是门
富有表达力的语言，很适合用于数据处理，当数据分析遇上数据可视化时pyecharts诞生了。
"""

# json数据格式
"""

JSON是一种轻量级的数据交互格式。可以按照JSON指定的格式去组织和封装数据
JSON本质上是一个带有特定格式的字符串

主要功能:json就是一种在各个编程语言中流通的数据格式，负责不同编程语言中的数据传递和交互，类似于:
    国际通用语言-英语
    中国56个民族不同地区的通用语言-普通话



json的作用
各种编程语言存储数据的容器不尽相同,在Python中有字典dict这样的数据类型，而其它语言可能没有对应的字典。
为了让不同的语言都能够相互通用的互相传递数据，JSON就是一种非常良好的中转数据格式。如下图，以Python和C语言互传数据为例:
    python数据格式--json格式数据--C语言程序接受Json格式数据并转化为C格式数据继续使用
    c数据格式---json格式数据--Python语言程序接受Json格式数据并转化为Python格式数据继续使用


json格式数据转化
json格式的数据要求很严格，下面我们看一下他的要求
# json数据的格式可以是:字典
{"name":"admin","age":18}   
# 也可以是:列表，如果json是列表形式的话，列表内部嵌套的是字典
[{"name":"admin","age":18},{"name":"root","age":16},{"name":"张三","age":20}]  

# 导入json模块
import json
# 准备符合格式json格式要求的python数据
data = [{"name": "老王", "age": 16}, {"name": "小强", "age": 18}]
# 通过 json.dumps(data)方法把python数据转化成json数据

# 注：中文转换是会出一个编码问题，如果要解决这个问题，就再dumps方法中传入另一个参数，ensure_ascii=False。
表面不使用Ascll码来转换它，而是把它内容直接输出出去，如果为True，中文就会转换为unicode的字符

json_string = json.dumps(data)   # json_string = json.dumps(data, ensure_ascii=False)
print(f"json_string的数据类型是{type(json_string)}")    # class 'str'，就是一个用于特点格式的字符串。
print(json_string)  # [{"name": "\u8001\u738b", "age": 16}, {"name": "\u5c0f\u5f3a", "age": 18}]

# 通过 json.loads(data)方法把json数据转化成python数据
data = '[{"name": "老王", "age": 16}, {"name": "小强", "age": 18}]'
l = json.loads(data)
print(type(l))      # <class 'list'>
print(l)            # [{'name': '老王', 'age': 16}, {'name': '小强', 'age': 18}]


"""

# pyecharts模块介绍
"""
如果想要做出数据可视化效果图，可以借助pyecharts模块来完成
概况
    Echarts 是个由百度开源的数据可视化，凭借着良好的交互性，精巧的图表设计，得到了众多开发者的认可,而 
    Python 是门富有表达力的语言，很适合用于数据处理.当数据分析遇上数据可视化时pyecharts 诞生了。

    官网网站：pyecharts.ory   
    画廊工具如何打开官网示例：https://gallery.pyecharts.org/#/Bar/bar_base_dict_config

"""

# pyecharts快速入门
"""
1.构建一个基础的折线图
# 基础折线图
# 导包，导入Line功能构建折线图对象
from pyecharts.charts import Line
# 得到折线图对象
line = Line()
# 添加x轴数据
line.add_xaxis(["中国", "美国", "英国"])
# 添加y轴数据
line.add_yaxis("GDP",[30, 20 , 10])
# 通过render方法，将代码生成为图像
line.render()



2.使用全局配置项设置属性
pyecharts有哪些配置选项？
pyecharts模块中有很多的配置选项，常用到2个类别的选项:
    全局配置选项  比如图像的标题、图例、工具箱等待
    系列配置选项  针对具体的轴数据进行配置，比如Y轴的数据

set_global_opts方法
    这里全局配置选项可以通过set_global_opts方法来进行配置，相应的选项和选项的功能如下:

# 导包，导入Line功能构建折线图对象
from pyecharts.charts import Line
from pyecharts.options import TitleOpts, LegendOpts, ToolboxOpts, VisualMapOpts

# 得到折线图对象
line = Line()
# 添加x轴数据
line.add_xaxis(["中国", "美国", "英国"])
# 添加y轴数据
line.add_yaxis("GDP",[30, 20 , 10])
# 设置全局配置项set_global_opts来设置,position表示位置，控制上下，pos_bottom控制上下。
line.set_global_opts(
    # left左，表示靠近最左边有多远，enter居中显示；bottom底部，表示距离底部多远，距离底部只要1%的距离。
    title_opts=TitleOpts(title="GDP展示", pos_left="center", pos_bottom="1%"),   # 关键词传参,控制标题
    legend_opts=LegendOpts(is_show=True),      # 图例
    toolbox_opts=ToolboxOpts(is_show=True),   # 工具箱
    visualmap_opts=VisualMapOpts(is_show=True),   # 视觉映射功能

)

# 通过render方法，将代码生成为图像
line.render()

    系统配置项后续的构建案列中会讲
"""

# 数据准备/生成折线图
"""
json数据可视化网站：ab173

# 导入json包
import json
from pyecharts.charts import Line
from pyecharts.options import TitleOpts, LabelOpts
# 数据处理
f_us = open("D:/python——test/第1-12章资料/资料/资料/可视化案例数据/折线图数据/美国.txt", "r", encoding= "UTF=8")
us_date = f_us.read()   # 读取到美国的全部内容

f_in = open("D:/python——test/第1-12章资料/资料/资料/可视化案例数据/折线图数据/印度.txt", "r", encoding="UTF=8")
in_date = f_in.read()   # 读取到印度F的全部内容

f_jp = open("D:/python——test/第1-12章资料/资料/资料/可视化案例数据/折线图数据/日本.txt", "r", encoding="UTF=8")
jp_date = f_jp.read()   # 读取到日本的全部内容

# 去掉不合的json规范的开头
us_date = us_date.replace("jsonp_1629344292311_69436(", "")
in_date = in_date.replace("jsonp_1629350745930_63180(", "")
jp_date = jp_date.replace("jsonp_1629350871167_29498(", "")
# 去掉不合JSON的结尾
us_date = us_date[:-2]
in_date = in_date[:-2]
jp_date = jp_date[:-2]

# 将json转换成字典
us_dict = json.loads(us_date)
in_dict = json.loads(in_date)
jp_dict = json.loads(jp_date)

# print(type(us_date))
# print(us_date)

# 获取trend key
us_trend_date = us_dict['data'][0]["trend"]
in_trend_date = in_dict['data'][0]["trend"]
jp_trend_date = jp_dict['data'][0]["trend"]
# print(type(trend_date))
# print(trend_date)

# 获取日期数据、用于x轴，取2020年(到314下标结束)
us_x_data = us_trend_date["updateDate"][:314]
in_x_data = in_trend_date["updateDate"][:314]
jp_x_data = jp_trend_date["updateDate"][:314]
# print(x_data)

# 获取确认数据，用于y轴，取2020年(到314下标结束)
us_y_data = us_trend_date["list"][0]["data"][:314]
jp_y_data = jp_trend_date["list"][0]["data"][:314]
in_y_data = in_trend_date["list"][0]["data"][:314]
# print(y_data)


# 生成图表
line = Line()   # 构建折线图对象

# 添加 x 轴折线图数据
line.add_xaxis(us_x_data)    # x轴的数据是共用的，所以使用一个国家的数据即可

# 添加 y 轴数据，对系列的属性进行设置，在y中添加参数label_opts=LabelOpts(is_show=False)，需要提前导入包LabelOpts
line.add_yaxis("美国确诊人数", us_y_data, label_opts=LabelOpts(is_show=False)) # 添加美国的y轴数据
line.add_yaxis("日本确诊人数", jp_y_data,label_opts=LabelOpts(is_show=False))  # 添加日本的y轴数据
line.add_yaxis("印度确诊人数", in_y_data,label_opts=LabelOpts(is_show=False))  # 添加印度的y轴数据

# 设置全局选项
line.set_global_opts(
    # 标题设置
    title_opts=TitleOpts(title="2020年美日印三国确诊人数对比折线图", pos_left="center", pos_bottom="1%")

)


# 调用render方法，生成图标
line.render()

# 关闭文件对象
f_us.close()
f_in.close()
f_jp.close()
"""

# 数据可视化-地图可视化

"""
# 基础地图演示
# 导包pyecharts.charts  Map
from pyecharts.charts import Map

# 构建地图对象
map = Map()

# 准备数据
date = [
    ("北京市", 99),
    ("上海市", 199),
    ("湖南省", 299),
    ("台湾省", 399),
    ("广东省", 499),
]

# 添加数据
map.add("测试地图", date, "china")

# 绘图
map.render()


# 基础地图演示——视觉演示器
# 导包
from pyecharts.options import VisualMapOpts


# 设置全局选项
map.set_global_opts(
    visualmap_opts=VisualMapOpts(    # 地图的视觉指示器
        is_show=True,
        is_piecewise=True,   # 开启手动校准范围
        pieces=[             # 具体的范围
            {"min": 50, "max": 99, "label": "50-99人", "color": "#90EE90"},  # #90EE90值具体的rgb颜色值
            {"min": 100, "max": 199, "label": "100-199人", "color": "#c38b1d"},     # label表示分段的名字 
            {"min": 201, "max": 300, "label": "201-300人", "color": "#FF1493"},
            {"min": 301, "max": 400, "label": "301-400人", "color": "#36648B"},
            {"min": 401, "max": 500, "label": "401-500人", "color": "#7A378B"}
        ]
    )
)

"""

# 国内疫情地图
"""
import json
from pyecharts.charts import Map
from pyecharts.options import VisualMapOpts, TitleOpts

# 读取文件
f = open("D:/python——test/第1-12章资料/资料/资料/可视化案例数据/地图数据/疫情.txt","r",encoding="UTF-8")
data = f.read()
f.close()
# 取到各省数据
# 将字符串json格式转化为python的字典
data_dict = json.loads(data)
provice_data_list = data_dict ["areaTree"][0]["children"]  


# 组装省份和各省确诊人数为元组，并封装到列表中
data_list = []
for provice_data in provice_data_list:
    provice_name = provice_data["name"]
    provice_confirm = provice_data["total"]["confirm"]
    
    if provice_name=="北京"or provice_name=="天津"or provice_name=="上海"or provice_name=="重庆":
        data_list.append((provice_name+"市", provice_confirm))
    elif provice_name=="西藏"or provice_name=="内蒙古":
        data_list.append((provice_name + "自治区", provice_confirm))
    else:
        data_list.append((provice_name+"省",provice_confirm))
print(data_list)

# 创建地图
map = Map()
# 添加数据
map.add("各省确诊人数",data_list,)
# 设置全局配置，定制分段颜色
map.set_global_opts(
    title_opts=TitleOpts(title="各省疫情统计图"),
    visualmap_opts=VisualMapOpts(
        is_show=True,
        is_piecewise=True,
        pieces=[
            {"min": 1, "max": 9, "label": "1-9", "color": "#CCFFFF"},
            {"min":10,"max":99,"label":"10-99","color":"#FFFF00"},
            {"min":100,"max":999,"label":"100-999","color":"#FFF000"},
            {"min":1000,"max":4999,"label":"1000-4999","color":"#FF9966"},
            {"min":5000,"max":9999,"label":"5000-9999","color":"#FF6666"},
            {"min":10000,"max":99999,"label":"10000-99999","color":"#cc3333"},
            {"min":100000,"label":"100000+","color":"#990033"},
        ]
    )
)
# 绘图
map.render("全国疫情地图.html")
"""





# 演示河南省疫情地图开发

"""
# 导入json模块
import json
from pyecharts.charts import Map
from pyecharts.options import VisualMapOpts, TitleOpts

# 读取文件
f = open("D:/python——test/第1-12章资料/资料/资料/可视化案例数据/地图数据/疫情.txt", "r", encoding="UTF-8")
data = f.read()
f.close()

# 获取到河南省的数据
# 将字符串json数据转成python字典
date_dict = json.loads(data)

# 取到河南省数据
cities_data = date_dict["areaTree"][0]["children"][3]["children"]
# print(cities_data)
# 准备数据为元组，并放入list
data_list = []
for city_data in cities_data:
    city_name = city_data["name"] + "市"
    # print(city_name)
    city_confirm = city_data["total"]["confirm"]   # 确诊人数
    # print(city_confirm)
    data_list.append((city_name, city_confirm))

# print(data_list) 打印数据是否正确
# 手动添加济源市的疫情数据
data_list.append(("济源市", 5))

# 构建地图
map = Map()
map.add("河南省疫情分布", data_list, "河南")

# 设置全局配置项
map.set_global_opts(
    title_opts=TitleOpts(title="河南省疫情地图"),
    visualmap_opts=VisualMapOpts(
        is_show=True,
        is_piecewise=True,
        pieces=[
            {"min": 1, "max": 9, "label": "1-9", "color": "#CCFFFF"},
            {"min":10,"max":99,"label":"10-99","color":"#FFFF00"},
            {"min":100,"max":999,"label":"100-999","color":"#FFF000"},
            {"min":1000,"max":4999,"label":"1000-4999","color":"#FF9966"},
            {"min":5000,"max":9999,"label":"5000-9999","color":"#FF6666"},
            {"min":10000,"max":99999,"label":"10000-99999","color":"#cc3333"},
            {"min":100000,"label":"100000+","color":"#990033"},
        ]
    )
)

# 绘图

map.render("河南省疫情地图.html")
"""













